package com.wujie.mall.domain.order;

import lombok.Getter;

/**
 * 订单状态枚举
 * 
 * @author wujie
 * @since 2024-08-26
 */
@Getter
public enum OrderStatus {
    
    /**
     * 待支付
     */
    PENDING_PAYMENT(1, "待支付", "订单已创建，等待用户支付"),
    
    /**
     * 已支付
     */
    PAID(2, "已支付", "用户已完成支付，等待商家发货"),
    
    /**
     * 已发货
     */
    SHIPPED(3, "已发货", "商家已发货，商品在配送途中"),
    
    /**
     * 已完成
     */
    COMPLETED(4, "已完成", "用户已确认收货，交易完成"),
    
    /**
     * 已取消
     */
    CANCELLED(5, "已取消", "订单已取消"),
    
    /**
     * 已退款
     */
    REFUNDED(6, "已退款", "订单已退款");

    /**
     * 状态码
     */
    private final int code;
    
    /**
     * 状态名称
     */
    private final String name;
    
    /**
     * 状态描述
     */
    private final String description;

    OrderStatus(int code, String name, String description) {
        this.code = code;
        this.name = name;
        this.description = description;
    }

    /**
     * 根据状态码获取订单状态
     * @param code 状态码
     * @return 订单状态
     */
    public static OrderStatus fromCode(int code) {
        for (OrderStatus status : values()) {
            if (status.code == code) {
                return status;
            }
        }
        throw new IllegalArgumentException("不支持的订单状态码: " + code);
    }

    /**
     * 是否为最终状态
     * @return true-最终状态，false-非最终状态
     */
    public boolean isFinalStatus() {
        return this == COMPLETED || this == CANCELLED || this == REFUNDED;
    }

    /**
     * 是否可以支付
     * @return true-可以支付，false-不可以支付
     */
    public boolean canPay() {
        return this == PENDING_PAYMENT;
    }

    /**
     * 是否可以发货
     * @return true-可以发货，false-不可以发货
     */
    public boolean canShip() {
        return this == PAID;
    }

    /**
     * 是否可以取消
     * @return true-可以取消，false-不可以取消
     */
    public boolean canCancel() {
        return this == PENDING_PAYMENT || this == PAID;
    }

    /**
     * 是否可以退款
     * @return true-可以退款，false-不可以退款
     */
    public boolean canRefund() {
        return this == PAID || this == SHIPPED;
    }
}